学习函数式编程,从了解变量开始(Scheme之变量) 您所在的位置:网站首页 scheme 函数 学习函数式编程,从了解变量开始(Scheme之变量)

学习函数式编程,从了解变量开始(Scheme之变量)

#学习函数式编程,从了解变量开始(Scheme之变量)| 来源: 网络整理| 查看: 265

【本文放入 0.2.3函数编程范式 】2021.3 

2.学习函数式编程,从了解变量开始

Scheme与C系列语言的一个重大差异,在于对变量(variable)的理解和处理。在C系语言中,变量表示一个存储场所,是源代码中保存值的符号化地址。Scheme中,定义变量是为了拥有一个程序中方便使用的名字。该名字与其代表的软件实体形成关联、即形成名值对,称为绑定。

C系语言中变量x可以使用赋值表达式不停地给变量赋值,以至于一些自以为是的教材称“变量是其值可变的量”。C系语言中的名字/标识符,除了可以不停地被赋值的变量,另外的主要用途是命名常量和函数名。而这些命名常量和函数名,正是Scheme中需要定义变量的主要原因。对于绝大多数程序员而言,函数编程范式最表象的特点,就是变量的值尽可能不要变化。

★函数式编程的重要特性:数据的不变性(immutabledata/不可变数据)。

正如Java中不变类的优点一样,函数编程语言中更为基础的不可变数据,使得它在多核时代越来越受到宠爱,因为各个线程之间不需要同步/互斥或加锁,极大方便了并行程序开发。

赋值表达式的副作用在函数式编程语言被格外警惕——不到万不得已不使用赋值表达式。为此,Scheme将赋值表达式设定为远远较等号麻烦得多的书写形式,其一般格式为:

(set! )。

从语言的类型系统(type system) 考虑,Scheme的变量没有类型(或者借用C的说法,变量拥有同样的类型——保存的是可以指向任何东西的指针,它可以一会儿指向一个整数,一会儿指向点对,一会儿指向函数)。作为一般准则:在使用前必须声明变量并必须初始化(具有值)。

Xyz        →xyz: undefined;          ;;; REPL会打印一条消息,指示发生了未绑定异常

对变量的全面讨论,会涉及变量的绑定、作用域、可见性和生命周期。

定义一个全局变量,通常使用define块。而let和lambda表达式中的局部变量,在该表达式外不可见。

3. 函数定义和函数应用

在丘奇的λ演算中,函数定义有两个特点。①λ表达式都是匿名函数。函数定义指构造一个函数,W是参数为变量x的λ表达式,则λx . W是λ表达式,此时W是函数体,参数就是变量x。例如(lambda (x) (* x x)) 描述了一个计算过程。为匿名函数取一个名字,或者说定义一个变量,能够方便地多次使用该函数,通常会受到编程语言的支持。②每个函数只有一个输入参数,如λn. λm.λf.λx. ((n f)  (++ m) )。而在编程实践中,函数通常可以有一个参数列表。逻辑学家 Haskell Curry证明可以将一个拥有多个参数的函数转化为只有一个参数的多个函数的连续调用,这一转化过程称为对拥有多个参数的函数的currying/柯里化,参见[2.3.3柯里化]。

函数应用是指给函数一个(实际)参数并使用该函数进行求值。Scheme中操作符都是函数,因此操作符和λ表达式组成的表达式如(+ 2 3 4),可以归结为函数应用——函数+的应用。Scheme采用前缀表示法来描述(特别是多元函数的)函数应用。简单地例子如例程2-5所示。

(define pi 3.14);;;命名常量 (define x 28) ;;;全局变量,Java; int x; (lambda (x) (* x x)) ;;匿名函数,隐藏同名全局变量 (define square (lambda (x) (* x x)) ) ;;函数定义 (define (square x) (* x x) ) ;;函数定义的语法糖, (square 2) ;;函数应用 →4 (let ((x 3)) (+ x 7));;; →10 (square x);;;使用全局变量 →9 (set! x 5);;;赋值操作 (square x);;; →25 (set! x square);;;赋值操作 (x 5);;; →25

 

变量是标识符,主要用于绑定常量和函数体。

在源代码中,变量如同值一样参与各种运算,被使用的变量也称变量引用(variable reference)。当函数名作为变量的基本形式,暗示着函数在Scheme中的地位有了根本性地改善——语言的第一阶/头等(first-class)元素,哪里能够使用变量,哪里就能够使用函数。

变量没有类型。变量可以一会儿绑定常量,一会儿函数体,暗示着函数和常量被一视同仁。或者说,函数式编程包含一个基本理念:函数是(一种)数据。

 

 

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有